package prh25.biblioteca.service;

import java.util.List;

import org.apache.commons.validator.GenericValidator;

import prh25.biblioteca.entity.Coordenador;
import prh25.biblioteca.entity.Documento;
import prh25.biblioteca.entity.Professor;
import prh25.biblioteca.entity.Usuario;
import prh25.biblioteca.entity.dao.ProfessorDAO;
import prh25.biblioteca.entity.dao.UsuarioDAO;
import prh25.biblioteca.entity.dao.hibernate.HibernateDAOFactory;
import prh25.biblioteca.entity.dao.hibernate.HibernateUtil;
import prh25.biblioteca.service.exception.RestricaoIntegridadeException;
import prh25.biblioteca.service.exception.UsuarioExistenteException;

public class ProfessorServiceImpl implements ProfessorService {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	ProfessorDAO professorDAO;
	
	public void setProfessorDAO(ProfessorDAO professorDAO) {
		this.professorDAO = professorDAO;
	}

	@Override
	/**
	 * Salva um professor no banco de dados.
	 * @param professor a ser salvo no banco de dados.
	 */
	public Integer criar(Professor professor) {
		
		professor.getEndereco().uid();
		
		professorDAO = HibernateDAOFactory.DEFAULT.buildProfessorDAO();
		validar(professor);
		checkDuplicidade(professor);
		// Inicio da transacao
		
		try {
			HibernateUtil.beginTransaction();
			professorDAO.saveOrUpdate(professor);
			HibernateUtil.commitTransaction();
		} catch (Exception ex) {
			ex.printStackTrace();
			HibernateUtil.rollbackTransaction();
			// Aqui deve ser adiconada o url de aviso de erro
		}finally{
			HibernateUtil.getSession().flush();
			HibernateUtil.getSession().clear();
		}
		return professor.getId();
	}
	
	/**
	 * Busca um professor pelo seu id.
	 * @param id - Id a ser buscado.
	 * @return Professor que possui o id buscado.
	 */
	public Professor recuperarPorId(Integer id) {
		return professorDAO.getById(id);
	}
	
	/**
	 * Valida os dados de um professor.
	 * @param coordenador - Coordenador a ter os dados validados.
	 * @throws RestricaoIntegridadeException - Excecao lancada se houve alguma
	 * restricao de integridade.
	 */
	private void validar(Professor professor) throws RestricaoIntegridadeException {
		
		if (GenericValidator.isBlankOrNull(professor.getEmail()))
			throw new RestricaoIntegridadeException("Dados incompleto");
		if (GenericValidator.isBlankOrNull(professor.getCurso()))
			throw new RestricaoIntegridadeException("Dados incompleto");
		if (GenericValidator.isBlankOrNull(professor.getNome()))
			throw new RestricaoIntegridadeException("Dados incompleto");
		if (GenericValidator.isBlankOrNull(professor.getLogin()))
			throw new RestricaoIntegridadeException("Dados incompleto");
		if (GenericValidator.isBlankOrNull(professor.getSenha()))
			throw new RestricaoIntegridadeException("Dados incompleto");
		if (!GenericValidator.isEmail(professor.getEmail()))
			throw new RestricaoIntegridadeException("Nao eh um email valido.");
	}
	
	/**
	 * Verifica se o professor a ser inserido no banco de dados jah existe.
	 * @param professor - professor a ser inserido.
	 */
	private void checkDuplicidade(Professor professor) {
		UsuarioDAO usuarioDAO = HibernateDAOFactory.DEFAULT.buildUsuarioDAO();
		
		List<Usuario> logins = usuarioDAO.findByLogin(professor.getLogin());
		
		if (!logins.isEmpty()) 
			throw new UsuarioExistenteException("Usuario ja existe");
	}
	
	@Override
	/**
	 * Salva um arquivo no banco de dados.
	 * @param documento - Documento a ser salvo no banco de dados.
	 * @param diretorioAplicacao - diretorio onde se encontra o arquivo.
	 * @return True se o arquivo foi salvo com sucesso, false caso contrario.
	 */
	public boolean finalizarEnvioArquivo(Documento documento, String diretorioAplicacao) {
		DocumentoService servico = new DocumentoServiceImpl();
		return servico.finalizarEnvioArquivo(documento, diretorioAplicacao);
	}
	
	

}
